from rest_framework import serializers
from django_redis import get_redis_connection
import logging

logger = logging.getLogger('meiduo')

# serializers.ModelSerializer
# serializers.Serializer
# 因为校验中不需要数据入库,也没有对应的模型,所以选择Serializer
class RegisterSmsCodeSerializer(serializers.Serializer):

    # text = xxx & image_code_id = xxx

    text = serializers.CharField(label='图片验证码', max_length=4, min_length=4, write_only=True)
    image_code_id = serializers.UUIDField(label='uuid')

    # 验证的四种方式, 字段类型, 字段选项, 单个字段验证, 多个字段验证

    def validate(self, attrs):
        text = attrs['text']
        image_code_id = attrs['image_code_id']

        # 链接redis,获取redis中的验证码
        redis_conn = get_redis_connection('code')
        redis_text = redis_conn.get('img_%s'%image_code_id)

        # 判断从redis中获取的验证码是否存在
        if not redis_text:
            raise serializers.ValidationError('验证码已过期')

        # 将redis中的验证码删除
        try:
            redis_conn.delete('img_%s' % image_code_id)
        except Exception as e:
            logger.error(e)

        # 对redis的验证码编码之后进行比对,要注意大小写问题
        # redis的数据获取之后是 bytes类型
        if redis_text.decode().lower() != text.lower():
            raise serializers.ValidationError('验证码输入错误')

        return attrs
